package com.iking.housekeeping.service.menu;

import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.iking.housekeeping.dao.menu.SysMenuMapper;
import com.iking.housekeeping.entity.menu.SysMenu;
import com.iking.housekeeping.httpbean.menu.resbean.ReturnSysMenu;
import com.iking.housekeeping.util.CodeUtil;

/**
 * 菜单管理Service
 * @author 张重阳   秦甫杰
 *
 */
@Service
public class MenuService {

	@Autowired
	private SysMenuMapper sysMenuMapper;

	/**
	 * 获取全部菜单
	 */
	public List<ReturnSysMenu> getAllMenu() {
		return sysMenuMapper.selectAll();
	}

	/**
	 * 将菜单列表转换为树结构
	 * 
	 * @param sysMenuList
	 * @return
	 */
	public List<ReturnSysMenu> getMenuTree(List<ReturnSysMenu> sysMenuList, String fMenuPCode) {
		List<ReturnSysMenu> returnSysMenuList = new ArrayList<ReturnSysMenu>();
		// 遍历所有的菜单
		for (ReturnSysMenu sysMenu : sysMenuList) {
			// 如果此菜单的父级code等于传入的父级code
			if (sysMenu.getfMenuPCode().equals(fMenuPCode)) {
				// 将此菜单加入到returnSysMenuList
				returnSysMenuList.add(sysMenu);
				// 再次循环此方法并设置为子菜单
				sysMenu.setChildren(getMenuTree(sysMenuList, sysMenu.getfMenuCode()));
			}
		}
		return returnSysMenuList;
	}

	/**
	 * 插入菜单
	 */
	public int insertMenu(SysMenu sysMenu) {
		int result = 0;
		if (sysMenuMapper.insertSelective(sysMenu) > 0) {
			result = 1;
		}
		return result;
	}

	/**
	 * 根据id查询菜单
	 */
	public SysMenu selectMenuById(String  fId) {
		return sysMenuMapper.selectByPrimaryKey(fId);
	}

	/**
	 * 根据id更新菜单
	 */
	public int updateMenu(SysMenu sysMenu) {
		return sysMenuMapper.updateByPrimaryKeySelective(sysMenu);
	}

	/**
	 * 查询一级菜单
	 */

	public List<SysMenu> selectFirstMenu() {
		return sysMenuMapper.selectFirstMenu();
	}

	/**
	 * 查询子菜单
	 */

	public List<SysMenu> selectByPCode(String pCode) {
		return sysMenuMapper.selectByPCode(pCode);
	}

	/**
	 * 根据菜品编号查询菜品信息
	 */
	public SysMenu selectMenuByCode(String code) {
		return sysMenuMapper.selectByPrimaryKeyByCode(code);
	}

	/**
	 * 根据菜单id删除出菜品
	 */
	public int delMenuByCode(String fId) {
		return sysMenuMapper.deleteByPrimaryKey(fId);
	}

	/**
	 * 更改菜单编号
	 * 
	 * @param sysMenu
	 * @param fMenuCode
	 */
	public void changeSysMenuCode(SysMenu sysMenu, String fMenuCode) {
		// 1原父级菜单编号
		String oldfMenuCode = sysMenu.getfMenuCode();
		// 2更改子菜单的父级编号fMenuCode
		sysMenu.setfMenuCode(fMenuCode);
		// 3更新当前父级菜单的编号
		sysMenuMapper.updateByPrimaryKeySelective(sysMenu);
		// 4根据原父级编号获取当下所有子菜单
		List<SysMenu> menuChildren = sysMenuMapper.selectByPCode(oldfMenuCode);
		// 5循环更改子菜单编号
		for (SysMenu children : menuChildren) {
			// 5-1更改父级编号中的父级编号
			children.setfMenuPCode(fMenuCode);
			// 5-2递归更改子菜单编号
			changeSysMenuCode(children, CodeUtil.changeCode(fMenuCode, children.getfMenuCode()));
		}
	}

	/**
	 * 菜单排序
	 * 
	 * @param menuList
	 */
	public void soltSysMenuList(List<SysMenu> menuList) {
		// 1定义一个当前的父级菜单号
		String fMenuCode;
		// 2定义一个新的父级菜单号
		String newfMenuCode;
		// 3遍历所有的父节长度
		for (int i = 0; i < menuList.size(); i++) {
			// 3-1获取当前父级菜单编号
			fMenuCode = menuList.get(i).getfMenuCode();
			// 3-2正常菜单编号应为i+1,满足则跳过
			if (i + 1 == CodeUtil.getIndexByCode(fMenuCode)) {
				continue;
			}
			// 3-3如果序号>=10,则倒数第二位补0
			newfMenuCode = CodeUtil.getCodeByPCode(fMenuCode, i);
			// 3-4更改菜单编号
			changeSysMenuCode(menuList.get(i), newfMenuCode);
		}
	}

	/**
	 * 根据fCode模糊查询菜单列表
	 * @param code
	 * @return
	 */
	public List<SysMenu> selectSysMenuByFCode(String code) {
		return sysMenuMapper.selectSysMenuByFCode(code);
	}

	/**
	 * 根据菜单名称查询菜单
	 * @param name
	 * @return
	 */
	public SysMenu selectSysMenuByName(String name) {
		return sysMenuMapper.selectSysMenuByName(name);
	}
}
